package text;

import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;

public class GcTest {

    public static void main(String[] args) {
//        test01();
        test02();
    }

    public static void test01() {
        String weakStr = new String("测试弱引用");
        WeakReference weakReference = new WeakReference(weakStr);
        //切断强引用
        weakStr = null;
        //只有一个弱引用的对象，还可以通过get取到该对象
        System.out.println(weakReference.get());
        //强制辣鸡回收会清理仅有弱引用的对象占用资源
        System.gc();
        System.runFinalization();
        //仅有弱引用对象在辣鸡回收时会被回收
        System.out.println(weakReference.get());
    }

    public static void test02(){
        String weakStr = new String("测试虚引用");
        ReferenceQueue queue = new ReferenceQueue();
        //虚引用不能单独使用，必须和队列一起
        PhantomReference phantomReference = new PhantomReference(weakStr,queue);
        //仅有虚引用的对象不能直接获取对象
        System.out.println(phantomReference.get());
        //切断强引用
        weakStr = null;
        System.out.println(phantomReference.get());
        System.gc();
        System.runFinalization();
        //强制辣鸡回收会清理仅有虚引用的对象占用资源，同时把它添加到关联队列中
        System.out.println(queue.poll()==phantomReference);
    }
}
